﻿using System.Net.NetworkInformation;
using System;

namespace Gildor.SimpleHostMonitor.Desktop.Utilities
{
    /// <summary>
    /// Uses the <see cref="System.Net.NetworkInformation.Ping"/> class 
    /// to send an ICMP ping to a specified host asynchronously.
    /// </summary>
    class Pinger
    {
        /// <summary>
        /// The maximum timeout in milliseconds of the ping operation.
        /// </summary>
        public static readonly int MaxTimeOut = 4000;

        /// <summary>
        /// Pings the specified ip.
        /// </summary>
        /// <param name="ip">The ip.</param>
        /// <param name="callback">The callback.</param>
        public static void Ping (string ip, PingCompletedEventHandler callback)
        {
            Ping (ip, callback, ip, 3000);
        }

        /// <summary>
        /// Pings the specified ip.
        /// </summary>
        /// <param name="ip">The ip.</param>
        /// <param name="callback">The callback.</param>
        /// <param name="userToken">The user token.</param>
        /// <param name="timeout">The timeout (in milliseconds). </param>
        public static void Ping (string ip, PingCompletedEventHandler callback, object userToken, int timeout)
        {
            if (timeout > MaxTimeOut)
            {
                throw new ArgumentOutOfRangeException ("timeout");
            }

            //Ping object is disposable. It should be disposed when ping is completed.
            Ping ping = new Ping ();
            ping.PingCompleted += callback;
            ping.SendAsync (ip, timeout, userToken);
        }
    }
}
